iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
Software Development

從身邊神人大大身上學到的那些事系列 第 8

Use-the-index-luke 讀後筆記-4(n+1 question與join)

  • 分享至 

  • xImage
  •  

在現在的專案開發中,如果不是很困難的sql,通常會使用orm來幫助開發
一方面增加開發速度,一方面減少sql的問題
但在開發的時候,如果有涉及到子母表的搜尋,就可能會遇到n+1的問題

比如
想要列出某個使用者下的訂單的所有商品的資料

在orm下可能會寫成

orders = Order.getByUserId('001') // select * from order where id = '001'
for i = 0; i < orders.length; i ++ {
    order = orders[i]
    product = Product.getByIds(order.productId) // select * from product where id ='p001'
}

這時候會發現會需要跟資料庫的連線會根據orders的筆數來增加,而每一次跟db的互動,都是一次資源的浪費
而為了減少這個狀況,就會需要使用join來避免這個問題出現

orders = Order.getByUserId('001').
            leftJoin('product', 'product.id = order.product_id')
select * from order 
left join product on order.product_id = product.id
where order.id = '001'

透過這種方式,讓資料庫先幫你把資料組好,再一次回傳,就可以大大減少重複建立連線的方式

這在使用orm的時候,要特別特別注意,如果真的發生了,就等於後端程式在對db做ddos的攻擊


上一篇
番外篇-分散式系統為什麼這麼複雜
下一篇
番外篇-工程師為什麼要學習這麼多的知識
系列文
從身邊神人大大身上學到的那些事28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言